package com.fwmagic.spark.core.transformations

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * map的输入变换函数应用于RDD中所有元素，而mapPartitions应用于所有分区。
  * 区别于mapPartitions主要在于调用粒度不同。 mapPartition可以倒过来理解，
  * 先partition，再把每个partition进行map函数，
  * 适用场景： 如果在映射的过程中需要频繁创建额外的对象或者数据集链接，使用mapPartitions要比map高效的多。
  */
object MapPartitionsDemo {
    def main(args: Array[String]): Unit = {
        val conf: SparkConf = new SparkConf()
                .setAppName(this.getClass.getSimpleName)
                .setMaster("local[*]")

        val sc: SparkContext = new SparkContext(conf)

        val rdd1: RDD[Int] = sc.parallelize(Array(1,2,3,4,5,6),3)

        val rdd2: RDD[Int] = rdd1.mapPartitions(iter =>{iter.map(_ * 10)})

        rdd2.collect().foreach(println)

        sc.stop()
    }

}
